﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HTTT.DataAccess.DataInf;
using HTTT.Utilities;
using System.Data.Objects;

namespace HTTT.DataAccess
{
    public class HT_UserDAO : IHT_UserDAO
    {
        private static AppEntities dataContext;

        private IRepository<HT_User> repository;
        public HT_UserDAO()
        {
            dataContext = new AppEntities();
            repository = new RepositoryDAO<HT_User>(dataContext);
        }

        public IEnumerable<HT_User> GetAllHT_User()
        {
            var q = (from m in dataContext.HT_User
                     select m).Take(500);
            return q;
        }
        public HT_User GetHT_UserByID(Guid id)
        {
            return repository.Find(obj => obj.ID == id).SingleOrDefault();
        }
        public HT_User GetLastRecord()
        {
            return dataContext.HT_User.OrderByDescending(obj => obj.ID).FirstOrDefault();
        }

        public bool UpdateHT_User(HT_User inHT_User)
        {
            if (inHT_User == null) return false;
            HT_User upHT_User = repository.First(sobj => sobj.sAMAccountName == inHT_User.sAMAccountName);

            if (upHT_User == null) return false;
            upHT_User.givenName = inHT_User.givenName;
            upHT_User.initials = inHT_User.initials;
            upHT_User.sn = inHT_User.sn;
            upHT_User.displayName = inHT_User.displayName;
            upHT_User.description = inHT_User.description;
            upHT_User.mail = inHT_User.mail;
            upHT_User.wWWHomePage = inHT_User.wWWHomePage;
            upHT_User.title = inHT_User.title;
            upHT_User.physicalDeliveryOfficeName = inHT_User.physicalDeliveryOfficeName;
            upHT_User.company = inHT_User.company;
            upHT_User.department = inHT_User.department;
            upHT_User.manager = inHT_User.manager;
            upHT_User.streetAddress = inHT_User.streetAddress;
            upHT_User.postOfficeBox = inHT_User.postOfficeBox;
            upHT_User.l = inHT_User.l;
            upHT_User.postalCode = inHT_User.postalCode;
            upHT_User.st = inHT_User.st;
            upHT_User.c = inHT_User.c;
            upHT_User.homephone = inHT_User.homephone;
            upHT_User.voiceTelephoneNumber = inHT_User.voiceTelephoneNumber;
            upHT_User.mobile = inHT_User.mobile;
            upHT_User.facsimileTelephoneNumber = inHT_User.facsimileTelephoneNumber;
            upHT_User.ipPhone = inHT_User.ipPhone;
            upHT_User.info = inHT_User.info;
            //upHT_User.sAMAccountName = inHT_User.sAMAccountName;
            //upHT_User.userPrincipalName = inHT_User.userPrincipalName;
            upHT_User.distinguishedName = inHT_User.distinguishedName;
            upHT_User.userAccountControl = inHT_User.userAccountControl;
            upHT_User.pwdLastSet = inHT_User.pwdLastSet;
            upHT_User.accountExpired = inHT_User.accountExpired;
            upHT_User.whenCreated = inHT_User.whenCreated;
            upHT_User.whenChanged = inHT_User.whenChanged;
            
            return repository.SaveChanges() > 0;

        }
        public ReturnValue<bool> InsertHT_User(HT_User inHT_User)
        {
            if (inHT_User == null) return new ReturnValue<bool>(false, "Input data null");
            repository.Add(inHT_User);
            return new ReturnValue<bool>(repository.SaveChanges() > 0, "Input data null");
        }

        public ReturnValue<HT_User> InsertHT_UserAndReturn(HT_User inHT_User)
        {
            if (inHT_User == null) return new ReturnValue<HT_User>(null, "Input value not valid");
            HT_User ret = repository.AddAndReturn(inHT_User);
            return new ReturnValue<HT_User>(ret, "Successfull");
        }

        public ReturnValue<bool> DelHT_User(string username)
        {
            ReturnValue<bool> ret = new ReturnValue<bool>(false, "");
            try
            {
                HT_User objDel = repository.First(obj => obj.sAMAccountName == username);
                ret = DelHT_User(objDel);
            }
            catch (Exception)
            {
                ret.RetValue = false;
                ret.Msg = "Dữ liệu đã được sử dung trong chương trình - không thể xóa !";
            }
            return ret;
        }


        public ReturnValue<bool> DelHT_User(Guid id)
        {
            ReturnValue<bool> ret = new ReturnValue<bool>(false, "");
            try
            {
                HT_User objDel = repository.First(obj => obj.ID == id);
                ret = DelHT_User(objDel);
            }
            catch (Exception)
            {
                ret.RetValue = false;
                ret.Msg = "Dữ liệu đã được sử dung trong chương trình - không thể xóa !";
            }
            return ret;
        }

        public ReturnValue<bool> DelAllHT_User()
        {
            ReturnValue<bool> ret = new ReturnValue<bool>(false, "");
            try
            {
                int result = dataContext.ExecuteStoreCommand("DELETE FROM HT_User");
                return new ReturnValue<bool>(result > 0, "Xóa toàn bộ thành công");
            }
            catch (Exception)
            {
                ret.RetValue = false;
                ret.Msg = "Dữ liệu đã được sử dung trong chương trình - không thể xóa !";
            }
            return ret;
        }


        public ReturnValue<bool> DelHT_User(HT_User inHT_User)
        {
            ReturnValue<bool> ret = new ReturnValue<bool>(false, "");
            if (inHT_User == null)
            {
                ret.Msg = "input null";
                return ret;
            }
            try
            {
                repository.Delete(inHT_User);
                ret.RetValue = repository.SaveChanges() > 0;
            }
            catch (System.Exception)
            {
                ret.RetValue = false;
                ret.Msg = "Dữ liệu đã được sử dung trong chương trình - không thể xóa !";
            }
            return ret;
        }

        public ReturnValue<bool> DelAllHT_UserInOu(string ouPath)
        {
            ReturnValue<bool> ret = new ReturnValue<bool>(false, "");
            try
            {
                int result = dataContext.ExecuteStoreCommand("DELETE FROM HT_User WHERE distinguishedName LIKE '%"+ouPath+"'");
                return new ReturnValue<bool>(result > 0, "Xóa toàn bộ thành công");
            }
            catch (Exception)
            {
                ret.RetValue = false;
                ret.Msg = "Dữ liệu đã được sử dung trong chương trình - không thể xóa !";
            }
            return ret;
        }

        public IEnumerable<HT_User> SearchUser(string keyword, string ouPath)
        {
            try
            {
                var r = from m in dataContext.HT_User
                        where m.distinguishedName.Contains(ouPath)
                        && (m.userPrincipalName.Contains(keyword)
                        || m.givenName.Contains(keyword)
                        || m.initials.Contains(keyword)
                        || m.sn.Contains(keyword)
                        )
                        select m;
                return r;

            }
            catch (Exception)
            {
                return null;
            }
        }

        public HT_User GetHT_UserByUsername(string username)
        {
            return repository.Find(obj => obj.sAMAccountName == username).SingleOrDefault();
        }

        public bool IsInOU(string path)
        {
            return repository.Exist(m => m.distinguishedName.Contains(path));
        }

        public bool IsExist(string username)
        {
            return repository.Exist(m => m.sAMAccountName == username);
        }
    }
}
